//块级作用域
if (true) {
	let a = 11
}
if (true) {
	// console.log('a', a)//a is not defined
}

// 暂时性死区
var aa = 11
if (true) {
	console.log('aa', aa)//aa 11
}

if (true) {
	// console.log('aa', aa)// Cannot access 'aa' before initialization
	const aa = 654
}

// Symbol

let sy1 = Symbol('kk')
let sy2 = Symbol('uu')
console.log('sy1', sy1)//sy1 Symbol(kk)
console.log('sy2', sy2)//sy2 Symbol(uu)

// 使用场景
// 每一个 Symbol 的值都是不相等的

// 作为对象的属性名
// Symbol 作为对象属性名时不能用.运算符，要用方括号。因为.运算符后面是字符串，所以取到的是字符串 sy 属性，而不是 Symbol 值 sy 属性。

// 写法1
let obj = {}
obj[sy1] = 'symbol属性值'

console.log('obj', obj)//obj { [Symbol(kk)]: 'symbol属性值' }

// 写法2
let obj2 = {
	[sy2]: 'symbol2'
}
console.log('obj2', obj2)//obj2 { [Symbol(uu)]: 'symbol2' }
for (let i in obj2) {
	console.log('for in ', i);//无输出
}
console.log('Object.keys(obj2)', Object.keys(obj2))//[]
console.log('Object.getOwnPropertyNames(obj2)', Object.getOwnPropertyNames(obj2))// []
console.log('Object.getOwnPropertySymbols(obj2)', Object.getOwnPropertySymbols(obj2))//[ Symbol(uu) ]
console.log('Reflect.ownKeys(obj2)', Reflect.ownKeys(obj2))//[ Symbol(uu) ]

// Symbol 值作为属性名时，该属性是公有属性不是私有属性，可以在类的外部访问。
//但是不会出现在 for...in 、 for...of 的循环中，也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。
//如果要读取到一个对象的 Symbol 属性，可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

// 定义常量


Symbol.for()
Symbol.keyFor


// Map对象
// Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

let map = new Map()

map.set('asdf', '和asdf关联的值1')
map.set('asdf2', '和asdf关联的值2')
map.set('asdf3', '和asdf关联的值3')
map.set('asdf4', '和asdf关联的值4')

console.log('取值map', map.get('asdf'));//取值map 和asdf关联的值
console.log('map', map)
// map Map(4) {
// 	'asdf' => '和asdf关联的值1',
// 	'asdf2' => '和asdf关联的值2',
// 	'asdf3' => '和asdf关联的值3',
// 	'asdf4' => '和asdf关联的值4'
//   }

// map.entries  返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组
console.log('map.entries()', map.entries())
// map.entries() [Map Entries] {
// 	[ 'asdf', '和asdf关联的值1' ],
// 	[ 'asdf2', '和asdf关联的值2' ],
// 	[ 'asdf3', '和asdf关联的值3' ],
// 	[ 'asdf4', '和asdf关联的值4' ]
//   }

// map.keys()

// map.values()

// 与数组的转换

var kvArray = [["key1", "value1"], ["key2", "value2"]];

let useMap = new Map(kvArray)  //
console.log('useMap', useMap)//useMap Map(2) { 'key1' => 'value1', 'key2' => 'value2' }

// 必须是二维数组
// 数组内容只取前两个,第一个建明,第二个键值.
// 二维数组只有一个值,键名是数组值,键值是undefine

console.log('Array.from(useMap)', Array.from(useMap))//Array.from(useMap) [ [ 'key1', 'value1' ], [ 'key2', 'value2' ] ]

// Map的克隆
var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
var myMap2 = new Map(myMap1);

// console.log(original === clone);
// 打印 false。 Map 对象构造函数生成实例，迭代出新的对象。

// Map的合并
var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);

// 合并两个 Map 对象时，如果有重复的键值，则后面的会覆盖前面的，对应值即 uno，dos， three
var merged = new Map([...first, ...second]);


